package com.victor.client;

import com.victor.common.RpcRequest;
import com.victor.common.RpcResponse;
import com.victor.register.RpcDiscover;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.UUID;

/**
 *  动态代理类,用于获取每个类的代理对象
 *  对于被代理对象的所有的方法调用都会执行invoke方法
 * Created by DJJ on 2019/3/12.
 */
public class RpcProxy {
    //用于获取到RPC-Server的地址信息
    private RpcDiscover rpcDiscover;

    public RpcDiscover getRpcDiscover() {
        return rpcDiscover;
    }
    public void setRpcDiscover(RpcDiscover rpcDiscover) {
        this.rpcDiscover = rpcDiscover;
    }
    public <T> T getInstance(Class<T> interfaceClass){
        T instance = (T)Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //创建请求对象
                RpcRequest rpcRequest=new RpcRequest();
                //获取到所调用的类名和RPC-Server中的serviceMap中的key进行匹配
                String className = method.getDeclaringClass().getName();
                //获取到参数的列表
                Class<?>[] parameterTypes = method.getParameterTypes();
                //生成一个请求id
                rpcRequest.setRequestId(UUID.randomUUID().toString());
                rpcRequest.setClassName(className);
                rpcRequest.setParametersTypes(parameterTypes);
                rpcRequest.setParameters(args);
                rpcRequest.setMethodName(method.getName());
                //创建一个rpc-client,并将请求发送到服务端
                RpcResponse rpcResponse = new RpcClient(rpcRequest, rpcDiscover).send();
                return rpcResponse;
            }
        });
        return instance;
    }
}
